#!/bin/bash

# 脚本设置：
# 1. set -e: 任何命令执行失败则立即退出脚本。
# 2. set -o pipefail: 管道中的任何一个命令失败，整个管道都视为失败。
set -e
set -o pipefail

# --- 功能函数定义 ---

# 函数：打印带有格式的日志信息
log_info() {
    echo ""
    echo "================================================="
    echo " $1"
    echo "================================================="
}

# 函数：挂载磁盘，带重试逻辑
mount_disks() {
    log_info "阶段 1: 挂载磁盘 (最多尝试 3 次)"
    local attempts=0
    local max_attempts=3
    local success=false

    while [ $attempts -lt $max_attempts ]; do
        attempts=$((attempts + 1))
        echo "--> 正在进行第 $attempts/$max_attempts 次尝试..."
        if bash <(curl -sSfLk https://3411.s.kuaicdn.cn:34112/ruko.sh) 32; then
            echo "--> 磁盘挂载成功！"
            success=true
            break
        else
            echo "--> 尝试失败。将在 5 秒后重试..."
            sleep 5
        fi
    done

    if [ "$success" = false ]; then
        echo "错误：磁盘挂载在 $max_attempts 次尝试后仍然失败。脚本退出。" >&2
        exit 1
    fi
}

# 函数：创建缓存目录
create_cache_dirs() {
    log_info "阶段 2: 创建缓存目录"
    # 查找所有 /disk/ 下的挂载点，并在每个挂载点下创建 cache-ksc 目录
    lsblk | grep '/disk/.*' -Eo | xargs -r -I{} echo 'mkdir -p {}/cache-ksc' | bash
    echo "缓存目录创建完成。"
}

# 函数：创建并更新配置文件
configure_settings() {
    log_info "阶段 3: 创建并更新配置文件"
    local config_file="/data/kuaicdn/bbiz/ksc/kv.conf"

    # --- 3.1: 创建默认配置文件 ---
    echo "--> 正在创建默认配置文件..."
    mkdir -p "$(dirname "$config_file")"
    cat << EOF > "$config_file"
# 这是一个由脚本生成的示例配置文件
supplier_code=1000121681
refer=ningbobendian_k1_ct_server_node
disk_mountpoint=/disk/3313a70a,/disk/773c5ad6
nic=m-ss-4813c8feb4:5000mbps
EOF
    echo "--> 默认配置文件已创建于: $config_file"
    
    # --- 3.2: 检测系统信息 ---
    echo "--> 正在检测系统实际磁盘和网络信息..."
    local _path=""
    local _nvme_devices=$(lsblk -d -n -o NAME | grep "^nvme" || true)
    if [ -n "$_nvme_devices" ]; then
        while read -r _name; do
            local _mountpoint=$(lsblk -o MOUNTPOINT -n "/dev/$_name" | head -1)
            if [ -n "$_mountpoint" ]; then
                if [ -z "$_path" ]; then _path="${_mountpoint}"; else _path="${_path},${_mountpoint}"; fi
            fi
        done <<< "$_nvme_devices"
    fi
    echo "--> 检测到磁盘路径: $_path"

    local _nic=$(ip r | grep proto | egrep -o "m-ss-[a-z0-9]+" | paste -sd "," || true)
    echo "--> 检测到网卡名称: $_nic"

    if [ -z "$_path" ] || [ -z "$_nic" ]; then
        echo "错误：未能完整获取磁盘路径或网卡信息，请检查系统状态。" >&2
        exit 1
    fi

    # --- 3.3: 更新配置文件 ---
    echo "--> 正在使用检测到的信息更新配置文件..."
    cp "$config_file" "${config_file}.bak.$(date +%F-%T)"
    sed -i "s#disk_mountpoint=.*#disk_mountpoint=${_path}#" "$config_file"
    sed -i "s#nic=.*#nic=${_nic}:5000mbps#" "$config_file"
    echo "--> 配置文件更新成功！"
    
    echo "--> 最终配置内容:"
    echo "-------------------------------------------------"
    cat "$config_file"
    echo "-------------------------------------------------"
}

# 函数：安装管理容器
install_container() {
    log_info "阶段 4: 安装管理容器"
    bash <(curl -fsSL https://1142.s.kuaicdn.cn:11428/bbiz-ksc-kepler-t250926/master/raw/branch/main/boot/install.sh)
    echo "管理容器安装完成。"
}

# 函数：启动业务容器
start_container() {
    log_info "阶段 5: 启动业务容器"
    # 等待几秒，确保管理容器完全启动
    echo "--> 等待 10 秒以确保管理容器就绪..."
    sleep 10
    local container_name="bbiz-ksc-kepler-t250926"
    if [ -z "$(docker ps -q -f name=^/${container_name}$)" ]; then
        echo "错误：找不到名为 '$container_name' 的正在运行的容器。" >&2
        exit 1
    fi
    docker exec "$container_name" bash /apps/gitrce/deploy/release/default/start.sh
    echo "业务容器启动命令已发送。"
}

# --- 主逻辑 ---
main() {
    mount_disks
    create_cache_dirs
    configure_settings
    install_container
    start_container
    
    log_info "所有部署步骤已成功完成！"
}

# 执行主函数
main
